# -*- coding: utf-8 -*-
# @Time        : 2023/12/25 14:06
# @Author      : DaiQL
# @File        : npy_compare.py
# @Description : 比较文件夹下的.npy文件是否一致
import os

import numpy as np
from natsort import natsort

# 比较的精确度
DIFF_NUM = 3
# 两个文件的地址
dir1 = '/Users/admin/algo_result'
dir2 = '/Users/admin/test_result'


def diff_list(list1, list2, dir1, dir2, diff_num):
    # 对比文件，按照按序对比文件夹
    all_list = set(list1 + list2)
    if len(all_list) > 0:
        for i in all_list:
            if i.startswith('.'):
                # 是隐藏文件夹，跳过
                continue
            if i in list1 and i not in list2:
                print(f"{dir1}目录中多出：{i}")
            elif i in list2 and i not in list1:
                print(f"{dir2}目录中多出：{i}")
            elif i in list1 and i in list2:
                if os.path.isdir((dir1 + "/" + i)) and os.path.isdir((dir2 + "/" + i)):
                    dir11 = dir1 + "/" + i
                    dir22 = dir2 + "/" + i
                    do(dir11, dir22)
                if os.path.isfile((dir1 + "/" + i)) and os.path.isfile((dir2 + "/" + i)):
                    file11 = dir1 + "/" + i
                    file22 = dir2 + "/" + i

                    list11 = np.load(file11, encoding='bytes', allow_pickle=True)[0]
                    list22 = np.load(file22, encoding='bytes', allow_pickle=True)[0]

                    # 比较两个文件是否相同
                    # 通过设置np.around第二个参数，可以设置小数点后几位
                    # 例如np.around(list11, 2)就是小数点后2位
                    test11 = np.around(list11, diff_num)
                    test22 = np.around(list22, diff_num)
                    true_num = 0
                    # 循环比较512个数字是否相同
                    for i in range(512):
                        if test11[i] == test22[i]:
                            true_num += 1
                    # 输出正确率
                    print(true_num / 512)


def do(dir1, dir2):
    # 读取文件
    flist1 = os.listdir(dir1)
    flist2 = os.listdir(dir2)
    # 文件目录重新自然排序，同Windows
    new_filelist1 = natsort.natsorted(flist1)
    new_filelist2 = natsort.natsorted(flist2)
    diff_list(new_filelist1, new_filelist2, dir1, dir2, DIFF_NUM)


if __name__ == '__main__':
    # 仅打印输出有差异的文件、目录，若执行完成无内容输出，则表示两个目录无差异。
    do(dir1, dir2)
